/* eslint-disable no-unused-vars */
/**
 * @description 下载文件(显示进度条)
 * @author liup
 * @version 2022-01-16
 */

import React from 'react'
import axios from 'axios'
// import { saveAs } from 'file-saver'

import { withProxy } from '@/utils/http'

// 后台指定的头部字段
const FILE_SIZE_FIELD = 'file_size'

/**
 * @prop {string} downloadUrl 下载路径(普通get请求)
 * @prop {object?} axiosConfig 自定义请求配置
 * @prop {string} downloadUrl 下载路径
 * @prop {string} downloadName 下载文件名
 * @prop {number?} duration 下载成功后, 提示框显示的时间(秒)
 * @prop {string?} sizeField 后台协定的,保存到headers中的判断文件大小的字段
 */
export default async function downloadFile({
  downloadUrl, // 如果是 get 请求

  // 完整的配置, 使用时, 'downloadUrl' 不生效
  axiosConfig = {
    method: 'get',
    url: '',
  },
  downloadName,
  duration = 4,
  sizeField = FILE_SIZE_FIELD,
} = {}) {
  if (!downloadName) {
    return Promise.reject(new Error('文件下载失败. "downloadName"不能为空'))
  }
  if (!downloadUrl && !axiosConfig.url) {
    return Promise.reject(new Error('文件下载失败. "downloadUrl"或"axiosConfig"至少指定一个'))
  }

  // 缓存下载进度,用于catch
  let percent = 0
  try {
    // const token = '' //tokenStorage.get('value')

    const config =
      axiosConfig && withProxy(axiosConfig.url)
        ? { ...axiosConfig, url: withProxy(axiosConfig.url) }
        : { method: 'get', url: withProxy(downloadUrl) }

    const res = await axios({
      responseType: 'blob',
      // headers: { Authorization: token },
      ...config,
      onDownloadProgress: (event) => {
        // 由于接口返回的是压缩之后的文件流, 导致无法设置 'content-length' 属性
        // 从而使 axios 无法计算文件的总大小(event.lengthComputable)
        // 使用 'file_size' 字段来代替
        const total = parseInt(event.srcElement.getResponseHeader(sizeField), 10)
        percent = ~~(100 * (event.loaded / total))
      },
    })

    // const blob = new Blob([res.data])
    // saveAs(blob, downloadName)
    saveAs(res, downloadName)
  } catch (err) {}
}

function saveAs(res, fileName) {
  let blob = new Blob([res.data], {
    type: 'application/vnd.ms-excel',
  })
  if (window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveBlob(blob, fileName)
  } else {
    var link = document.createElement('a')
    link.href = window.URL.createObjectURL(blob)
    link.download = fileName
    let evt = document.createEvent('MouseEvents')
    evt.initEvent('click', true, true)
    link.dispatchEvent(evt)
    //释放内存
    window.URL.revokeObjectURL(link.href)
  }
}
